package ModelAndController;
/*
 * A Controller egyfajta kiegészítéseként fogható fel,a hibakezelésért felelős.
 *  A kapott hibakódott,illetve üzetetet dolgozzal fel.
 */
import java.util.*;

public class ExceptionHandler {
	//A hibaüzeneteket tároló tömb
	String[] errorMessages;
	//konstruktor
	public ExceptionHandler(){
		initErrorMessages();
	}
	//A hibákat kezelő függvény
	public String reactToException(Exception e) throws Exception{
		String retString = "";
		try{
			StringTokenizer tks = new StringTokenizer(e.getMessage());
			boolean firstTokenIsANumber = true;
			int temp = -1;
			try{
				temp = Integer.parseInt(tks.nextToken());
			}catch(Exception t){
				firstTokenIsANumber = false;
			}
			if( firstTokenIsANumber && (-1 < temp) && (temp<errorMessages.length) && !errorMessages[temp].contentEquals("") )
				retString = e.getMessage().replaceFirst(Integer.toString(temp), errorMessages[temp]);
			else
				retString = "Ismeretlen hiba tortent! "+e.getMessage();
		}catch(Exception t){
			retString = "Ismeretlen hiba tortent! "+e.getMessage();
		}
		throw new Exception(retString);
	}
	//A hibaüzeneteket inicializáló függvény
	private void initErrorMessages(){
		errorMessages = new String[320];
		initElementErrorMessages();
		initORErrorMessages();
		initInverterErrorMessages();
		initANDErrorMessages();
		initSwitchErrorMessages();
		initSignalGeneratorErrorMessages();
		initCircuitElementsErrorMessages();
		initGateErrorMessages();
		initCompositeErrorMessages();
		initReadCircuitFromFileErrorMessages();
		initDisplayErrorMessages();
		initSchedulerErrorMessages();
		initWireErrorMessages();
		initScopeErrorMessages();
	}
	//Az Elementek hibaüzeneteit inicializáló függvény
	private void initElementErrorMessages(){
		errorMessages[0] = "Element bemenetenek szama nem lehet negativ.";
		errorMessages[1] = "Element bemenet tombje ures, nem lehet bemento wiret megadni.";
		errorMessages[2] = "Element bemenet wire-t nem lehet elmenteni. Nem megfelelo tombszam index.";
		errorMessages[3] = "Element kimenetek szama nem lehet negativ.";
		errorMessages[4] = "Element adott kimenetenek wire szama nem lehet negativ.";
		errorMessages[5] = "Element kimeneti tombje ures, nem lehet kimeneti wiret megadni.";
		errorMessages[6] = "Element kimeneti wire-t nem lehet elmenteni. Nem megfelelo kimenet tombszam index.";
		errorMessages[8] = "Element kimeneti tombje ures, nem lehet kimeno wiret megadni.";
		errorMessages[9] = "Element kimeneti tombje nem lehet negativ.";
		errorMessages[10] = "Element kimeneti tombjenek nem megfelelo az indexe.";
		errorMessages[11] = "Element minden bemenetere kell egy huzal.";
		errorMessages[12] = "Element minden kimenetere kell legalabb egy huzal.";
		errorMessages[13] = "Element egyik kimeneterol hianyzik egy huzal.";
	}
	//Az OR kapu hibaüzeneteit inicializáló függvény
	private void initORErrorMessages(){
		errorMessages[40] = "OR kapunak nem lehet tobb kimenete.";
	}
	//Az inverter hibaüzeneteit inicializáló függvény
	private void initInverterErrorMessages(){
		errorMessages[60] = "Inverternek nem lehet tobb bemenete.";
		errorMessages[61] = "Inverternek nem lehet tobb kiemenete.";
	}
	//Az AND kapu hibaüzeneteit inicializáló függvény
	private void initANDErrorMessages(){
		errorMessages[80] = "Andnek nem lehet tobb kimenete.";
	}
	//A kapcsoló hibaüzeneteit inicializáló függvény
	private void initSwitchErrorMessages(){
		errorMessages[100] = "Switchnek nem lehet bemenete.";
	}
	//A jelgenerátor hibaüzeneteit inicializáló függvény
	private void initSignalGeneratorErrorMessages(){
		errorMessages[120] = "SignalGeneratornak nem lehet bemenete.";
	}
	//A hálózati elemek hibaüzeneteit inicializáló függvény
	private void initCircuitElementsErrorMessages(){
		errorMessages[140] = "CircuitElements inputGate szama nem lehet negativ.";
		errorMessages[141] = "CircuitElements inputGate tombje nem letezik. Nem sikerult bemeneti wire-t felvenni.";
		errorMessages[142] = "CircuitElements bemeneti wire-t nem sikerult felvenni. Az inputGate tomb indexe nem megfelelo.";
		errorMessages[143] = "CircuitElements outpuGate szama nem lehet negativ.";
		errorMessages[144] = "CircuitElements outputGate aktualis kimenetenek wire szamat nem lehet felvenni. Nem megfelelo outputGate tomb index.";
		errorMessages[145] = "CircuitElements outputGate tombje nem letezik.";
		errorMessages[146] = "CircuitElements kimeneti wire-t nem sikerult felvenni. Az outputGate tomb indexe nem megfelelo.";
		errorMessages[147] = "CircuitElements kimenetenek erteket nem sikerult lekerni. Az outputGate tomb indexe nem megfelelo.";
		errorMessages[148] = "CircuitElements-ben nem leteznek kompozit elemek, igy nem is tudnak reszletes informacioval szolgalni az utemezukrol.";
		errorMessages[148] = "CircuitElements-ben nem letezik ilyen sorszamu kompozit elem, igy ez nem is tud reszletes informacioval szolgaltani az utemezesrol";
		errorMessages[149] = "CircuitElements-ben nincs inputGate.";
		errorMessages[150] = "CircuitElements-ben nincs adott sorszamu inputGate.";
	}
	//A kapu hibaüzeneteit inicializáló függvény
	private void initGateErrorMessages(){
		errorMessages[160] = "Gate-nek nem lehet tobb bemenete.";
		errorMessages[161] = "Gate bemenetet nem sikerult felvenni, mert nem letezik az inputWire tomb.";
		errorMessages[162] = "Gate bemenetet nem sikerult felvenni. Hibas inputWire tomb index.";
		errorMessages[163] = "Gatenek nem lehet tobb kimenete.";
	}
	//A kompozit hibaüzeneteit inicializáló függvény
	private void initCompositeErrorMessages(){
		errorMessages[180] = "Composite circuitElements tomb nem letezik.";
	}
	//A fájl olvasó hibaüzeneteit inicializáló függvény
	private void initReadCircuitFromFileErrorMessages(){
		errorMessages[200] = "CircuitElement letrehozasa nem lehetseges. Kovetkezo file nem letezik:";
		errorMessages[201] = "CircuitElement letrehozasa nem lehetseges. Problema a File olvasasakor.";
		errorMessages[202] = "CircuitElement letrehozasa nem lehetseges. Fileban nincsenek hasznalhato sorok.";
		errorMessages[203] = "CircuitElement letrehozasa nem lehetseges. FileContent letrehozasanak hiba.";
		errorMessages[204] = "CircuitElement letrehozasa nem lehetseges. A # utan szamnak kellene kovetkeznie:";
		errorMessages[205] = "CircuitElement letrehozasa nem lehetseges. Az Elementek szamainak nullatol, egyesevel kell novekednie.";
		errorMessages[206] = "CircuitElement letrehozasa nem lehetseges. A halozatban nincs Element.";
		errorMessages[207] = "CircuitElement letrehozasa nem lehetseges. A halozatban nincs Wire.";
		errorMessages[208] = "CircuitElement letrehozasa nem lehetseges. Ismeretlen Element szerepel a halozatban:";
		errorMessages[209] = "CircuitElement letrehozasa nem lehetseges. Az Element bementenek szamat szamban kell megadni.";
		errorMessages[210] = "CricuitElement letrehozasa nem lehetseges. Az Element bemenetek szamat meg kell adni:";
		errorMessages[211] = "CricuitElement letrehozasa nem lehetseges. Az Element kimenetek szamat meg kell adni:";
		errorMessages[212] = "CircuitElement letrehozasa nem lehetseges. Az Element kimenetenek szamat szamban kell megadni.";
		errorMessages[213] = "CircuitElement letrehozasa nem lehetseges. Az Wire kimeneti szamat szamban kell megadni.";
		errorMessages[214] = "CircuitElement letrehozasa nem lehetseges. A Wire bemeneti elementjenek kimeneti szamat meg kell adni.";
		errorMessages[215] = "CircuitElement letrehozasa nem lehetseges. A Wire kimeneti elementjenek szamat meg kell adni.";
		errorMessages[216] = "CircuitElement letrehozasa nem lehetseges. A Wire kimeneti elementjenek szamat szamban kell megadni.";
		errorMessages[217] = "CircuitElement letrehozasa nem lehetseges. A Wire kimeneti elementjenek tomb indexe nem megfelelo.";
		errorMessages[218] = "CircuitElement letrehozasa nem lehetseges. AWire kimeneti elementjenek bemeneti indexet meg kell adni.";
		errorMessages[219] = "CircuitElement letrehozasa nem lehetseges. A Wire kimeneti elemetjenek bemeneti indexenek szamat szam formatumban kell megadni.";
		errorMessages[220] = "CircuitElement letrehozasa nem lehetseges. Minden kimenetre kell legalabb egy Wire-t:";
	}
	//A kijelző hibaüzeneteit inicializáló függvény
	private void initDisplayErrorMessages(){
		errorMessages[240] = "Display nem redelkezhet kimenettel.";
	}
	//Az ütemező hibaüzeneteit inicializáló függvény
	private void initSchedulerErrorMessages(){
		errorMessages[260] = "Circuit didn't reach stable state!";
	}
	//A huzal hibaüzeneteit inicializáló függvény
	private void initWireErrorMessages(){
		errorMessages[280] = "Huzalt valamelyik halozati elem kiemetere kell kotni.";
		errorMessages[281] = "Huzalt valamelyik halozati elem bemetere kell kotni.";
	}
	//Az oszcilloszkóp hibaüzeneteit inicializáló függvény
	private void initScopeErrorMessages(){
		errorMessages[300] = "Scopenak nem lehet kimenete.";
	}
}
